import java.util.HashMap;
import java.util.List;
import java.util.Map;

import IA.Energia.Centrales;
import IA.Energia.Clientes;
import aima.search.framework.Problem;
import aima.search.framework.Search;
import aima.search.framework.SearchAgent;
import aima.search.informed.HillClimbingSearch;


public class Experimento4 implements IExperiment {
	Map<String, List<Map<String, String>>> result;
	
	private void busquedaHillClimbing(double[] prTipos, double prContratos,
			int[] tiposCentrales, int nclientes) {
		int semilla = (int) Math.random() * 1000;
		
		Clientes clientes = null;
		
		try {
			clientes  = new Clientes(nclientes, prTipos , prContratos, semilla);
		} catch (Exception e1) {
			System.out.println("ERROR AL GENERAR CLIENTES: " + e1.getMessage());
			System.exit(1);
		}
		
		Centrales centrales = null;
		
		try {
			centrales = new Centrales(tiposCentrales, semilla);
		} catch (Exception e1) {
			System.out.println("ERROR AL GENERAR CENTRALES: " + e1.getMessage());
			System.exit(1);
		}
		
		Problem problem = new Problem(new Estado(clientes, centrales)
										, new EnergiaSuccessor()
										, new EnergiaGoalTest()
										, new EnergiaHeuristica());
		
		Search search = new HillClimbingSearch();
		try {
			SearchAgent searchAgent = new SearchAgent(problem, search);
			
			System.out.println(searchAgent.getActions().toString());
		} catch (Exception e) {
			System.out.println("ERROR: " + e.getMessage());
		}
	}
	
	@Override
	public void execute() {
		for(int i = 0; i < 10; ++i) {
			double prTipos[] = {0.2, 0.3, 0.5};
			double prContratos = 0.75;
			int tiposCentrales[] = { 5, 10, 25 };
			int tiposCentralesAux[] = { 5, 10, 25 };
			int nclientes = 500;
			while(tiposCentrales[0] + tiposCentrales[1] + tiposCentrales[2] < 400) {
				long tiempo = System.currentTimeMillis();
				busquedaHillClimbing(prTipos,prContratos,tiposCentrales,nclientes);
				tiempo = System.currentTimeMillis() - tiempo;
				System.out.print("tiempo : " + tiempo + " ms");
				tiposCentrales[0] += 5;
				tiposCentrales[1] += 10;
				tiposCentrales[2] += 25;
			}
			nclientes = 500;
			tiposCentrales = tiposCentralesAux;
			while(nclientes <= 2500) {
				long tiempo = System.currentTimeMillis();
				busquedaHillClimbing(prTipos,prContratos,tiposCentrales,nclientes);
				tiempo = System.currentTimeMillis() - tiempo;
				System.out.print("tiempo : " + tiempo + " ms");
				nclientes += 500;
			}
		}

	}

	@Override
	public void init() {
		result = new HashMap<String, List<Map<String, String>>>();
	}

	@Override
	public List<List<String>> getResult() {
		// TODO Auto-generated method stub
		return null;
	}

}
